A análise de redes é aplicada para descrever relações entre nossas observações de interesse. As relações podem ser de amizade entre pessoas, trocas comerciais entre paÃses, conexão entre atividades no planejamento estratégico de uma empresa, citações e co-autoria em artigos, etc.
Através da análise de redes obtemos novas estatÃsticas sobre os dados que temos e potencializamos nossas conclusões através das visualizações.
florence <- read_csv(here("data", "florentine.csv")) %>%
column_to_rownames("FAMILY") %>%
as.matrix()O objeto florence retrata uma matriz de adjacência, cujos elementos representam a relação entre duas unidades presentes nas linhas e colunas. Nesse caso, tratam-se de 16 famÃlias da elite Florentina e a existência de casamentos entre elas.
Essa matriz de adjacência representa uma rede não direcionada. PoderÃamos adicionar direção caso tivéssemos, por exemplo, a informação de qual famÃlia propôs o casamento.
Sem direcionamento, tanto as linhas quanto as colunas apresentam as mesmas informações:
Percebam que a rede é composta por nodes (nós/vértices) e edges (arestas), sendo esse o seu formato clássico de visualização. Com eles, podemos obter as principais medidas da análise de redes, as medidas de centralidade:
farness: computa a soma de edges de um dado nó para todos os demais nós da rede. Descreve quão isolado cada node está dos demais.
closeness: a distância entre dois nós é representada pelo número de edges que os conectam pelo menor caminho possÃvel. A medida closeness retrata quantas etapas um nó especÃfico precisa para acessar todos os outros nós da rede.
\[ closeness(v) = \frac{1}{farness(v)} = \frac{1}{\sum_{u \in V, u\neq v}\text{distância entre} \quad v \quad \mathrm{e} \quad u} \]
\[ closeness(v) = \frac{1}{farness(v)} = \frac{1}{\sum_{u \in V, u\neq v}\text{distância entre} \quad v \quad \mathrm{e} \quad u} \] Uma outra forma de olha para a centralidade é dividir farness pelo número de demais nós na rede. Podemos ver, por exemplo, que, em média, a famÃlia Medici está a 2,7 edges de cada nó da rede.
\[ betweenness(v) = \sum_{(t, u) \in V, t\neq u, u \neq v}\frac{\text{n de caminhos que contêm o nó} \quad v}{\text{n de caminhos entre} \quad t \quad e \quad u} \]
Vemos que a famÃlia Médici se localiza no menor caminho entre mais de 45% de todos os possÃveis caminhos entre os outros nós.
Com o resultado de betweenness(florence_ntw), produza um gráfico de barras.
Comparando medidas de centralidade:
# carregando dados
twitter <- read_csv(here("data", "twitter_following.csv"))
senator <- read_csv(here("data", "twitter_senator.csv"))twitter: temos a informação dos senadores que cada senador segue.senator: informações sobre cada senador.Vamos criar nossa matriz de adjacência com o objeto twitter. Percebam que ela é assimétrica.
Em redes direcionadas como essa, podemos analisar as medidas já vistas. Porém, agora temos dois tipos de degree, por exemplo:
Podemos calcular as duas medidas e atribuÃ-las ao nosso objeto senator.
Agora temos dois tipos de closeness: indegree e outdegree.
Podemos calcular as duas medidas e atribuÃ-las ao nosso objeto senator.
Para betweenness, os atributos indegree e outdegree não fazem diferença, pois a chegada ou a saÃda de edges de um nó não altera sua presença no caminho da rede. No entanto, podemos calcular a medida considerando ou não a direcionalidade da rede como um todo.
Podemos calcular as duas medidas e atribuÃ-las ao nosso objeto senator.
Com o código abaixo, plote a rede com a função plot() e calcule a betweenness da rede para directed = FALSE e directed = TRUE:
team <- data.frame(name=c("Alice", "Maria", "Rafael", "Davi"),
age=c(48,33,45,34),
gender=c("F","M","F","M"))
relations <- data.frame(from=c("Maria", "Maria", "Rafael", "Alice", "Davi",
"Rafael"),
to=c("Alice", "Rafael", "Maria", "Rafael", "Rafael",
"Davi"))
net_dir <- graph_from_data_frame(relations, directed=TRUE, vertices=team)Voltando ao exemplo do Twitter:
senator %>%
mutate(betweenness_dir = igraph::betweenness(twitter_adj, directed = TRUE),
betweenness_undir = igraph::betweenness(twitter_adj,
directed = FALSE)) %>%
ggplot(aes(x = betweenness_dir, y = betweenness_undir, colour = party,
shape = party)) +
geom_point() +
scale_color_manual(values = c("#0066ff", "#009900", "#ff3300")) +
labs(main = "Betweenness", x = "Directed", y = "Undirected")Page Rank: cada nó aloca votos para nós com ele conectados.
As instruções da tarefa estão no arquivo NN-class-ds4ir-assignment.rmd da pasta assignment que se encontra na raiz desse projeto.